/*
 * @Author: vinton
 * @Date: 2021-07-02 14:14:56
 * @LastEditTime: 2021-09-07 17:41:24
 * @LastEditors: Vinton
 * @Description: In User Settings Edit
 * @FilePath: /dc-cocos-tools/utils/index.js
 */
const fs = require('fs');
const path = require('path');
const shell = require('shelljs');
const { createLoaclComponents } = require('./initComp')
/**
 * @description: 把业务的预制资源组件库,放到管理管理器去 ,把预制资源节点放到层级管理器去生成普通Node节点。
 * @param {*} url 文件的路径
 * @param {*} uuid 当前选中的uuid
 * @param {*} AllComponent 是否全部组件都弄到项目里面去
 * @return {*} callback 回调函数
 */
function getCompoentsForProject(url, uuid, AllComponent = false) {
    // 把组件库的组件放到我们的cocos项目当中去
    let callBack = function () {
        Editor.assetdb.import(url, 'db://assets/Components', true, function (err, results) {
            results.forEach(function (result) {
                if (result.type === 'prefab') {
                    // 插入个预制节点
                    if (!AllComponent) {
                        // Editor.log('打印加载的预制资源', result.uuid, uuid)
                        Editor.Ipc.sendToPanel("scene", "scene:create-nodes-by-uuids", [result.uuid], uuid, { unlinkPrefab: null })
                    }
                }
            });
        });
    }
    return callBack
}

/**
 * @description: 自定义在根目录生成文件。然后可以传入回调执行自定义操作
 * @param {*} filename 生成文件名字
 * @param {*} callback 查询资源中数据，后到回调
 * @param {*} checkDownLoadRepository 是否检查一下当前扩展里面存在已经下载的组件库
 * @return {*}
 */
function verificationProjectPath(filenameList, callback, checkDownLoadRepository = true) {
    // 这里会先检查一下当前的插件是否有拉去最新的组件库
    if (checkDownLoadRepository && fs.readdirSync(`${path.join(__dirname, '../../node_modules/dc-cocos-components')}`).length === 0) {
        return
    }
    let verification = false
    filenameList.forEach(filename => {
        Editor.assetdb.queryAssets('db://assets/**\/*', '', function (err, results) {
            // assets that imported during init
            results.forEach(function (result) {
                if (result.url === `db://assets/${filename}`) {
                    verification = true
                }
            });
            if (!verification) {
                Editor.assetdb.create(`db://assets/${filename}`, '', callback);
            } else {
                if (callback) {
                    callback()
                }
            }
            verification = false
        });
    })
    // 如果没有毁掉函数，后面的方法就不执行了
    if (!callback) return
    checkDownLoadRepository ? Editor.success('业务组件库中组件加载到本地的cocos项目当中去!!!') : Editor.success('项目开发的工程目录已经自动创建完成!!!')
}
/**
 * @description:  获取本地组件的文件夹名称
 * @param {*} componentsLoalPath 文件夹的名字, 可以指定目标文件的名字。例如”Components/Countdown“ 就是把countdown文件下下面所有的文件读取过来
 * @return {*} 文件夹名字的数组
 */
function getComponentFileName(componentsLoalPath) {
    const nameList = []
    const _arr = componentsLoalPath.split('/')
    let loalpath = `../../node_modules/dc-cocos-components/assets/${_arr[0]}`
    try {
        fs.readdirSync(`${path.join(__dirname, loalpath)}`).forEach((file) => {
            var stat = fs.lstatSync(`${path.join(__dirname, loalpath)}/${file}`);
            if (stat.isDirectory()) {
                nameList.push(`${path.join(__dirname, loalpath)}/${file}`)
            }
        })
        // Editor.log('获取的路径=====>', componentsLoalPath, nameList)
        return _arr.length > 1 ? nameList.filter(item => item.includes(componentsLoalPath)) : nameList
    } catch (error) {
        Editor.error('扩展的远程组件库还没有下载,请先操作下载组件库,然后进行其他功能使用')
    }

}

function downLoadComp() {
    createLoaclComponents()
}
function downLoadCompForNpm() {
    Editor.log('开始加载最新的远程组件库=========>>>>>>>>>>>>>>')
    shell.exec('npm install dc-cocos-components', { cwd: path.resolve(__dirname, '../../') }, function (code, stdout, stderr) {
        if (stderr) Editor.log('stderr====》', stderr)
        if (stdout) Editor.log('stdout====》', stdout)
        if (code === 0) Editor.success('dc-cocos-组件库远程加载完成！！！！！！！！')
    })
}

module.exports = {
    verificationProjectPath,
    getCompoentsForProject,
    getComponentFileName,
    downLoadComp,
    downLoadCompForNpm
}